#递归函数、函数的引用、闭包、装饰器

#递归函数
'''
如果一个函数的内部不调用其它的函数，而是自己本身的话，这个函数就是递归函数。

递归函数特性：
1）必须有一个明确的结束条件；
2）每一次进入更深一层递归时，问题规模相比上次递归都应有所减少；
3）相邻两次重复之前有紧密的联系，前一次要为后一次做准备；
4）递归效率不高，递归层次过多会导致栈溢出
5）优点：定义简单，逻辑清晰
'''
#递推：给递归实现拆解，递归每一次都是基于上一次进行下一次的执行。
#回溯：遇到终止条件之前，从最后往回返，一级一级的把值返回来。


#累计和
#1-100求和
'''for循环'''
sum = 0
for i in range(1,101):
    sum += i
print(sum)

'''函数'''
def funa(n):
    sum = 0
    for i in range(1,n+1):
        sum += i
    print(sum)
funa(100)

'''递归函数  必须设置初始值，否则容易栈溢出'''
def funb(n):   #funb(n)表示n项的和
    if n>0:
        return funb(n-1)+n   #funb(n-1)表示前n-1项的和
    else:
        return 0
print(funb(100))
print('\n')


#斐波那契序列
'''
1,1,2,3,5,8,13,21,……
定义一个函数，求第n项。最后求得整个序列，先定义一个空的列表list1,用append
把符合条件的数据添加到序列中。
'''
list1 = []
def funa1(n):   #确定第n项的函数
    if n<=1:
        return n
    else:
        return funa1(n-1)+funa1(n-2)

#输出制定长度斐波拉契函数序列（1-10项）
for i in range(1,11):
    list1.append(funa1(i)) #添加第i项，完成上面函数的调用
print(list1)












